﻿// <ParaBellum for logging mobile worker.>
//     Copyright (C) 2013  APKO
// 
//     This program is free software: you can redistribute it and/or modify
//     it under the terms of the GNU General Public License as published by
//     the Free Software Foundation, either version 3 of the License, or
//     (at your option) any later version.
// 
//     This program is distributed in the hope that it will be useful,
//     but WITHOUT ANY WARRANTY; without even the implied warranty of
//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//     GNU General Public License for more details.
// 
//     You should have received a copy of the GNU General Public License
//     along with this program.  If not, see <http://www.gnu.org/licenses/>.

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Windows.Data;

namespace ParaBellum.gui_part.gui.controllers {
    internal class NumericConverter : IValueConverter {
        public object Convert(object value,
                              Type targetType,
                              object parameter,
                              CultureInfo culture) {
            if (null == value) {
                return null;
            }
            return targetType.UnderlyingSystemType == typeof (String) ? value.ToString() : value;
        }

        public object ConvertBack(object value, Type targetType,
                                  object parameter,
                                  CultureInfo culture) {
            //We create numbers from formatted text.
            if (null == value) {
                return null;
            }
            var numericTypes = new HashSet<Type> {
                typeof (Byte),
                typeof (Decimal),
                typeof (Double),
                typeof (Int16),
                typeof (Int32),
                typeof (Int64),
                typeof (SByte),
                typeof (Single),
                typeof (UInt16),
                typeof (UInt32),
                typeof (UInt64)
            };
            if (numericTypes.Contains(targetType.UnderlyingSystemType)) {
                var intTypes = new HashSet<Type> {
                    typeof (Byte),
                    typeof (Int16),
                    typeof (Int32),
                    typeof (Int64),
                    typeof (SByte),
                    typeof (UInt16),
                    typeof (UInt32),
                    typeof (UInt64)
                };
                string text = value.ToString().Replace(NumberFormatInfo.CurrentInfo.NumberGroupSeparator, String.Empty);
                if (intTypes.Contains(targetType.UnderlyingSystemType)) {
                    try {
                        return Int32.Parse(text);
                    }
                    catch {
                        return null;
                    }
                }
                try {
                    return Double.Parse(text);
                }
                catch {
                    return null;
                }
            }
            return value;
        }
    }
}